// File: ebnf2bnf.h
#ifndef EBNF2BNF_H
#define EBNF2BNF_H

#include <map>
#include <vector>
#include <stdexcept>

// 负数标记映射：
// -1 '(' , -2 ')' , -3 '*' , -4 '+' , -5 '|' , -6 '?'
// 正偶数：非终结符 ； 正奇数：终结符 ； 0：ε

class Ebnf2BnfConverter {
public:
    using GrammarEBNF = std::map<int, std::vector<int>>;
    using GrammarBNF = std::map<int, std::vector<std::vector<int>>>;

    Ebnf2BnfConverter();

    // 设置含 EBNF 标记的文法
    void setGrammar(const GrammarEBNF& ebnf);
    // 执行转换
    void convert();
    // 获取转换后的 BNF 文法
    const GrammarBNF& getBnfGrammar() const;

private:
    GrammarEBNF ebnf_;
    GrammarBNF bnf_;
    int nextNt_;  // 下一个可用非终结符（偶数）

    int genNonTerminal();
    // 处理一条产生式 lhs -> rhs(带正则标记)
    void processRule(int lhs, const std::vector<int>& rhs);
    // 将一个序列按 -5('|') 分割成多种交替方案
    std::vector<std::vector<int>> splitAlternatives(const std::vector<int>& seq);
};

#endif // EBNF2BNF_H
